xend: Do not mess with bridge if admin has set one up already
authorKeir Fraser <keir.fraser@citrix.com>
Tue, 15 Jun 2010 10:36:27 +0000 (11:36 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Tue, 15 Jun 2010 10:36:27 +0000 (11:36 +0100)
Previously, the default "network-script",
/etc/xen/scripts/network-bridge, would attempt to do its horrid work
even if you had already set everything up in /etc/network/interfaces.

Setting up your bridge in /etc/network/interfaces is:
 * easy
 * required for libxl since libxl never does it for you
 * not a fragile piece of lunacy
 * properly documented
 * the way everyone would expect it to work

In this small patch we make it so that the default config for xend
doesn't mess about on startup if you already have a bridge, and
doesn't mess about on shutdown unless your first-named bridge (eth0 or
xenbr0, normally) doesn't also have a physical interface named
p<whatever> (peth0 or pxenbr0) enslaved to it.  The latter test is not
ideal but will hopefully do from now until the time xend finally dies.

We also fix the "documentation" - ie, the comments in the default
xend-config.sxp - to correspond to reality.

Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>
tools/examples/xend-config.sxp
tools/hotplug/Linux/network-bridge

index 7ab7eb8f380586550f1dc2f24c2266148911b30e..b7e98f464d250a841ceadca659c9eb1ba60e1386 100644 (file)
 #
 # (network-script 'network-bridge netdev=eth1')
 #
-# The bridge is named xenbr0, by default.  To rename the bridge, use
+# The bridge is named eth0, by default (yes, really!)
 #
+
+# It is normally much better to create the bridge yourself in
+# /etc/network/interfaces.  network-bridge start does nothing if you
+# already have a bridge, and network-bridge stop does nothing if the
+# default bridge name (normally eth0) is not a bridge.  See
+# bridge-utils-interfaces(5) for full information on the syntax in
+# /etc/network/interfaces, but you probably want something like this:
+#    iface xenbr0 inet static
+#        address [etc]
+#        netmask [etc]
+#        [etc]
+#        bridge_ports eth0
+#
+# To have network-bridge create a differently-named bridge, use:
 # (network-script 'network-bridge bridge=<name>')
 #
 # It is possible to use the network-bridge script in more complicated
 # configuring a new vif, but a value specified here would act as a default.
 #
 # If you are using only one bridge, the vif-bridge script will discover that,
-# so there is no need to specify it explicitly.
+# so there is no need to specify it explicitly.  The default is to use
+# the bridge which is listed first in the output from brctl.
 #
 (vif-script vif-bridge)
 
index 070a9f9feb18f2db47d582b220ebb4b78b9a1909..035a58d8e2f259430bfe70a31b97152f37e61878 100644 (file)
@@ -216,6 +216,10 @@ op_start () {
        return
     fi
 
+    if [ `brctl show | wc -l` != 1 ]; then
+        return
+    fi
+
     if link_exists "$pdev"; then
         # The device is already up.
         return
@@ -264,6 +268,10 @@ op_stop () {
     if ! link_exists "$bridge"; then
        return
     fi
+    if ! [ -e "/sys/class/net/${bridge}/brif/${pdev}" ]; then
+        # $bridge is not a bridge to which pdev is enslaved
+        return
+    fi
 
     claim_lock "network-bridge"